package cn.tedu.innerclass;/**
 * @Author 金帮嘉诚 @Date 2021-06-25 星期五 14:38
 */
/*本类用于测试内部类的入门案例*/

/**
 * 知识点
 * 内部类 如何定义 如何创建内部类对象
 * 内部类中可以直接访问外部类的任何属性或方法
 */
public class TestInner1 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        /*外部类名.内部类名 对象名 = 外部类对象 .内部类对象*/
        Outer.Inner inner1 = new Outer().new Inner();
        inner1.delete();
        System.out.println(inner1.sum);
        //匿名
        new Outer().find();
    }
}

//外部类
class Outer {
    String name;
    private int age;

    public void find() {
        System.out.println("Outer");
        //测试 外部类使用内部类的资源
        //不能直接使用
//        System.out.println(sum);
//        delete();
        /*外部类如果想要使用内部类的资源，必须先创建内部类对象，通过内部类对象来调用内部类的资源*/
        Inner inner = new Inner();
        System.out.println(inner.sum);
        inner.delete();
    }

    //内部类--看作外部类的一个特殊成员
    /*根据内部类的位置不同，分为成员内部类（类里方法外）
     * 局部内部类（方法里）*/
    class Inner {
        int sum = 10;

        public void delete() {
            System.out.println("Inner...delete()");
            //测试 内部类使用外部类资源
            /*结论：内部类可以直接使用外部类的资源
             * 也包含私有资源*/
            System.out.println(name);
            System.out.println(age);
            //StackOverflowError来回调用导致内存溢出 栈溢出异常
            /*注意此处测试完需要注释掉，否则来回调用会抛出栈溢出异常*/
//            find();

        }
    }
}